package my.design.visitor;

import java.util.Arrays;

/**
 * @author zp
 * @version 1.0
 * @description: 观察者接口
 * 访问者模式主要由这五个角色组成，抽象访问者(Visitor)、具体访问者(ConcreteVisitor)、抽象节点(Node)、具体节点(ConcreteNode)和结构对象(ObjectStructure)。
 * <p>
 * 抽象访问者(Visitor)角色：声明了一个或者多个方法操作，形成所有的具体访问者角色必须实现的接口。
 * 具体访问者(ConcreteVisitor)角色：实现抽象访问者所声明的接口，也就是抽象访问者所声明的各个访问操作。
 * 抽象节点(Node)角色：声明一个接受操作，接受一个访问者对象作为一个参数。
 * 具体节点(ConcreteNode)角色：实现了抽象节点所规定的接受操作。
 * 结构对象(ObjectStructure)角色：有如下的责任，可以遍历结构中的所有元素
 * <p>
 * 简单理解
 * 就是先定义观察的数据的抽象类 比如学生和老师 都是User抽象类的具体实现
 * 在定义访问者的接口 定义访问者需要实现的方法 Principal(校长)、Parent（家长）他们属于不同的观察者
 * 查看相同的User（也是数据对象） 展现的数据就不同Visitor
 * User聚合了 Visitor接口 调用Visitor.visitor(User)方法
 * 同样的Visitor也聚合了User Visitor接口会定义不同User的类型定义不同的visitor方法
 * 可以自主的根据User的类型调用visitor(User)方法 完成对对象的控制
 * 传入的User不同 visitor(User)方法的执行逻辑也不相同
 * 最后通过 User聚合Visitor Visitor又会根据User的类型不同调用具体观察者的visitor(User)方法
 * 完成对不同访问者的方法或者权限控制
 * @date 2022/10/22 16:03
 */
public interface Visitor {
    // 访问学⽣信息
    void visit(Student student);

    // 访问⽼师信息
    void visit(Teacher teacher);

}
